--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 6e7370acdc4f0473f4f9eb6a850fd4a891bd00e1
Parents : 434f55b
Author : Mark Qvist <mark@unsigned.io>
Date : 2025-01-09T17:58:46+01:00
Added interference avoidance option
Changes
6 files changed, 104 insertions(+), 17 deletions(-)
Diff
diff --git a/Config.h b/Config.h
index 0133213..1152fda 100644
--- a/Config.h
+++ b/Config.h
@@ -96,6 +96,8 @@
#define CSMA_BAND_1_MAX_AIRTIME 7
#define CSMA_BAND_N_MIN_AIRTIME 85
#define CSMA_INFR_THRESHOLD_DB 12
+ bool interference_detected = false;
+ bool avoid_interference = true;
int csma_slot_ms = CSMA_SLOT_MIN_MS;
unsigned long difs_ms = CSMA_SIFS_MS + 2*csma_slot_ms;
unsigned long difs_wait_start = -1;
diff --git a/Framing.h b/Framing.h
index a8dc4f7..89e1039 100644
--- a/Framing.h
+++ b/Framing.h
@@ -62,6 +62,7 @@
#define CMD_NP_INT 0x65
#define CMD_BT_CTRL 0x46
#define CMD_BT_PIN 0x62
+ #define CMD_DIS_IA 0x69
#define CMD_BOARD 0x47
#define CMD_PLATFORM 0x48
diff --git a/Makefile b/Makefile
index 9e340af..53f32bd 100644
--- a/Makefile
+++ b/Makefile
@@ -226,8 +226,8 @@ upload-t3s3:
arduino-cli upload -p /dev/ttyACM0 --fqbn esp32:esp32:esp32s3
@sleep 1
rnodeconf /dev/ttyACM0 --firmware-hash $$(./partition_hashes ./build/esp32.esp32.esp32s3/RNode_Firmware.ino.bin)
- #@sleep 3
- #python ./Release/esptool/esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x210000 ./Release/console_image.bin
+ @sleep 3
+ python ./Release/esptool/esptool.py --chip esp32s3 --port /dev/ttyACM0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq 80m --flash_size 4MB 0x210000 ./Release/console_image.bin
upload-featheresp32:
arduino-cli upload -p /dev/ttyUSB0 --fqbn esp32:esp32:featheresp32
diff --git a/RNode_Firmware.ino b/RNode_Firmware.ino
index 12f6df0..98a327d 100644
--- a/RNode_Firmware.ino
+++ b/RNode_Firmware.ino
@@ -237,6 +237,15 @@ void setup() {
}
#endif
+ #if MCU_VARIANT == MCU_ESP32 || MCU_VARIANT == MCU_NRF52
+ #if MODEM == SX1280
+ avoid_interference = false;
+ #else
+ if (EEPROM.read(eeprom_addr(ADDR_CONF_DIA)) == 0x01) { avoid_interference = false; }
+ else { avoid_interference = true; }
+ #endif
+ #endif
+
// Validate board health, EEPROM and config
validate_status();
@@ -1152,6 +1161,17 @@ void serial_callback(uint8_t sbyte) {
display_unblank();
}
#endif
+ } else if (command == CMD_DIS_IA) {
+ if (sbyte == FESC) {
+ ESCAPE = true;
+ } else {
+ if (ESCAPE) {
+ if (sbyte == TFEND) sbyte = FEND;
+ if (sbyte == TFESC) sbyte = FESC;
+ ESCAPE = false;
+ }
+ dia_conf_save(sbyte);
+ }
} else if (command == CMD_DISP_RCND) {
#if HAS_DISPLAY
if (sbyte == FESC) {
@@ -1189,7 +1209,11 @@ void serial_callback(uint8_t sbyte) {
portMUX_TYPE update_lock = portMUX_INITIALIZER_UNLOCKED;
#endif
-bool medium_free() { update_modem_status(); return !dcd; }
+bool medium_free() {
+ update_modem_status();
+ if (avoid_interference && interference_detected) { return false; }
+ return !dcd;
+}
bool noise_floor_sampled = false;
int noise_floor_sample = 0;
@@ -1215,6 +1239,8 @@ void update_noise_floor() {
#endif
}
+#define LED_ID_TRIG 16
+uint8_t led_id_filter = 0;
void update_modem_status() {
#if MCU_VARIANT == MCU_ESP32
portENTER_CRITICAL(&update_lock);
@@ -1232,13 +1258,22 @@ void update_modem_status() {
portEXIT_CRITICAL();
#endif
- if (carrier_detected) { dcd = true; }
- else { dcd = false; }
+ interference_detected = current_rssi > (noise_floor+CSMA_INFR_THRESHOLD_DB);
+ if (interference_detected) { if (led_id_filter < LED_ID_TRIG) { led_id_filter += 1; } }
+ else { if (led_id_filter > 0) {led_id_filter -= 1; } }
+
+ if (carrier_detected) { dcd = true; } else { dcd = false; }
dcd_led = dcd;
if (dcd_led) { led_rx_on(); }
- else { if (airtime_lock) { led_indicate_airtime_lock(); }
- else { led_rx_off(); } }
+ else {
+ if (interference_detected) {
+ if (led_id_filter >= LED_ID_TRIG && noise_floor_sampled) { led_id_on(); }
+ } else {
+ if (airtime_lock) { led_indicate_airtime_lock(); }
+ else { led_rx_off(); led_id_off(); }
+ }
+ }
}
void check_modem_status() {
diff --git a/ROM.h b/ROM.h
index 6f2ac2f..27c38bb 100644
--- a/ROM.h
+++ b/ROM.h
@@ -23,7 +23,7 @@
#define ADDR_HW_REV 0x02
#define ADDR_SERIAL 0x03
#define ADDR_MADE 0x07
- #define ADDR_CHKSUM 0x0B
+ #define ADDR_CHKSUM 0x0B
#define ADDR_SIGNATURE 0x1B
#define ADDR_INFO_LOCK 0x9B
@@ -43,6 +43,7 @@
#define ADDR_CONF_PSET 0xB5
#define ADDR_CONF_PINT 0xB6
#define ADDR_CONF_BSET 0xB7
+ #define ADDR_CONF_DIA 0xB9
#define INFO_LOCK_BYTE 0x73
#define CONF_OK_BYTE 0x73
diff --git a/Utilities.h b/Utilities.h
index 03e4985..000db68 100644
--- a/Utilities.h
+++ b/Utilities.h
@@ -165,53 +165,73 @@ uint8_t boot_vector = 0x00;
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif MCU_VARIANT == MCU_ESP32
#if HAS_NP == true
void led_rx_on() { npset(0, 0, 0xFF); }
void led_rx_off() { npset(0, 0, 0); }
void led_tx_on() { npset(0xFF, 0x50, 0x00); }
void led_tx_off() { npset(0, 0, 0); }
+ void led_id_on() { npset(0x90, 0, 0x70); }
+ void led_id_off() { npset(0, 0, 0); }
#elif BOARD_MODEL == BOARD_RNODE_NG_20
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_RNODE_NG_21
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_RNODE_NG_22
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_TBEAM
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, LOW); }
void led_tx_off() { digitalWrite(pin_led_tx, HIGH); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_TDECK
void led_rx_on() { }
void led_rx_off() { }
void led_tx_on() { }
void led_tx_off() { }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_TBEAM_S_V1
void led_rx_on() { }
void led_rx_off() { }
void led_tx_on() { }
void led_tx_off() { }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_LORA32_V1_0
#if defined(EXTERNAL_LEDS)
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#else
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#endif
#elif BOARD_MODEL == BOARD_LORA32_V2_0
#if defined(EXTERNAL_LEDS)
@@ -219,11 +239,15 @@ uint8_t boot_vector = 0x00;
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#else
void led_rx_on() { digitalWrite(pin_led_rx, LOW); }
void led_rx_off() { digitalWrite(pin_led_rx, HIGH); }
void led_tx_on() { digitalWrite(pin_led_tx, LOW); }
void led_tx_off() { digitalWrite(pin_led_tx, HIGH); }
+ void led_id_on() { }
+ void led_id_off() { }
#endif
#elif BOARD_MODEL == BOARD_HELTEC32_V2
#if defined(EXTERNAL_LEDS)
@@ -231,50 +255,68 @@ uint8_t boot_vector = 0x00;
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#else
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#endif
#elif BOARD_MODEL == BOARD_HELTEC32_V3
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_LORA32_V2_1
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_HUZZAH32
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_GENERIC_ESP32
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#endif
#elif MCU_VARIANT == MCU_NRF52
#if HAS_NP == true
- void led_rx_on() { npset(0, 0, 0xFF); }
- void led_rx_off() { npset(0, 0, 0); }
- void led_tx_on() { npset(0xFF, 0x50, 0x00); }
- void led_tx_off() { npset(0, 0, 0); }
+ void led_rx_on() { npset(0, 0, 0xFF); }
+ void led_rx_off() { npset(0, 0, 0); }
+ void led_tx_on() { npset(0xFF, 0x50, 0x00); }
+ void led_tx_off() { npset(0, 0, 0); }
+ void led_id_on() { npset(0x90, 0, 0x70); }
+ void led_id_off() { npset(0, 0, 0); }
#elif BOARD_MODEL == BOARD_RAK4631
void led_rx_on() { digitalWrite(pin_led_rx, HIGH); }
void led_rx_off() { digitalWrite(pin_led_rx, LOW); }
void led_tx_on() { digitalWrite(pin_led_tx, HIGH); }
void led_tx_off() { digitalWrite(pin_led_tx, LOW); }
+ void led_id_on() { }
+ void led_id_off() { }
#elif BOARD_MODEL == BOARD_HELTEC_T114
- // Heltec T114 pulls pins LOW to turn on
- void led_rx_on() { digitalWrite(pin_led_rx, LOW); }
- void led_rx_off() { digitalWrite(pin_led_rx, HIGH); }
- void led_tx_on() { digitalWrite(pin_led_tx, LOW); }
- void led_tx_off() { digitalWrite(pin_led_tx, HIGH); }
+ // Heltec T114 pulls pins LOW to turn on
+ void led_rx_on() { digitalWrite(pin_led_rx, LOW); }
+ void led_rx_off() { digitalWrite(pin_led_rx, HIGH); }
+ void led_tx_on() { digitalWrite(pin_led_tx, LOW); }
+ void led_tx_off() { digitalWrite(pin_led_tx, HIGH); }
+ void led_id_on() { }
+ void led_id_off() { }
#endif
#endif
@@ -1556,6 +1598,12 @@ void drot_conf_save(uint8_t val) {
#endif
}
+void dia_conf_save(uint8_t val) {
+ if (val > 0x00) { eeprom_update(eeprom_addr(ADDR_CONF_DIA), 0x01); }
+ else { eeprom_update(eeprom_addr(ADDR_CONF_DIA), 0x00); }
+ hard_reset();
+}
+
void np_int_conf_save(uint8_t p_int) {
eeprom_update(eeprom_addr(ADDR_CONF_PSET), CONF_OK_BYTE);
eeprom_update(eeprom_addr(ADDR_CONF_PINT), p_int);
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────